package cn.tzauto.octopus.secsLayer.util;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Created by gavin on 16/3/21.
 */

public class XmlUtil {
    /**从xml中解析出stripid
     *
     * @param xmlStr
     * @return
     */
    public static String getStripIdFromXml(String xmlStr) {
        xmlStr =xmlStr.replace("&","&amp;");
        //格式化xml字符串，去除回车、换行、多余的空格符
        StringBuilder sb = new StringBuilder();
        boolean betweenBracket=false;//标识是否在括号之间，即<>之间
        char[] xmlcar = xmlStr.toCharArray();
        boolean preCharIsEmpty=false;
        for (int i = 0; i < xmlcar.length; i++) {
            char tempChar=xmlcar[i];
            if (tempChar == '<') {
                betweenBracket=true;
            }
            if (tempChar == '>') {
                betweenBracket=false;
            }
            if (tempChar == '\n' || tempChar == '\r' ||tempChar == '\t') {
                if(betweenBracket&&!preCharIsEmpty){//如果是括号之间的换行，那么增加一个空格
                    sb.append(" ");
                    preCharIsEmpty=true;
                }
                continue;
            }
            if(tempChar == ' '){//如果该字符是空格
                if(!betweenBracket){//如果不在括号之间，那么直接跳过
                    continue;
                }else{//如果在括号之间
                    if(preCharIsEmpty){//如果前一个已经是空格，那么跳过，不再增加空格
                        continue;
                    }
                }
            }
//            System.out.print(xmlcar[i]);
            sb.append(xmlcar[i]);
            preCharIsEmpty=false;
        }

        //解析xml字符串，生成Mapping2DBin集合
//        List<Mapping2DBin> mapping2dBin = new ArrayList<Mapping2DBin>();
        try {
            //创建工厂和document
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document document = db.parse(new InputSource(new StringReader(sb.toString())));
            Element root = document.getDocumentElement();

            //解析得到SubstrateMaps节点
            Element rnode = null;
            System.out.println("root长度" + root.getChildNodes().getLength());
            for (int i = 0; i < root.getChildNodes().getLength(); i++) {
                rnode = (Element) root.getChildNodes().item(i);
                if (rnode.getNodeName().equalsIgnoreCase("SubstrateMaps")) {
                    break;
                }
            }

            //获得SubstrateMaps节点的第一个子节点，即SubstrateMap节点
            Element esmap = (Element) rnode.getChildNodes().item(0);
            String stripId = esmap.getAttribute("SubstrateId");//获取stripid
            return stripId;
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }


    /**
     * 测试用
     *
     * @param args
     */
    public static void main(String[] args) {
        String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "<MapData>\n" +
                "<SubstrateMaps>\n" +
                "<SubstrateMap LayoutSpecifier=\"Strip/SubMatrix/Device\"\n" +
                "SubstrateId=\"00FA00107\" SubstrateType=\"Strip\">\n" +
                "<Overlay MapName=\"BinCodeMap\">\n" +
                "<BinCodeMap BinType=\"Integer2\" NullBin=\"0100\">\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f010f01000100010f010f01000100010f010f010f010f01000100010001000100010001000100010001000100010f010f01000100010001000100010001000100010001000100010001000100010001000100010f0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f010f01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f0100010001000100010001000100010001000100010001000100010f010f01000100010f010f010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>0100010001000100010001000100010001000100010001000100010001000100010001000100010f01000100010f01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f0100010001000100</BinCode>\n" +
                "<BinCode>0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f0100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f010f0100010f010f010001000100010001000100010001000100010001000100010001000100010001000100010f</BinCode>\n" +
                "<BinCode>0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f010f010f010f010f010001000100010001000100010001000100010001000100010001000100010001000100010f0100</BinCode>\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010f01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f010f0100010f01000100010f010001000100010f010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>01000100010001000100010001000100010001000100010f010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f010f010f010f01000100010001000100010f010f010f010f0100010001000100010001000100010001000100010001000100010001000100010001000100010f</BinCode>\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f010f010001000100010001000100010001000100010001000100010001000100010f010001000100010001000100</BinCode>\n" +
                "<BinCode>0100010001000100010001000100010f0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010001000100010f01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f01000100</BinCode>\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f010f0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f0100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f01000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "<BinCode>01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010f010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100</BinCode>\n" +
                "</BinCodeMap>\n" +
                "</Overlay>\n" +
                "</SubstrateMap>\n" +
                "</SubstrateMaps>\n" +
                "</MapData>";
        String xml2="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "<MapData xmlns=\"urn:semi-org:xsd.E142-1.V1005.SubstrateMap\">\n" +
                "    <SubstrateMaps>\n" +
                "        <SubstrateMap LayoutSpecifier=\"StripLayout/Device\"\n" +
                "            SubstrateId=\"TBG641M001.001_01\" SubstrateType=\"Strip\">\n" +
                "            <Overlay MapName=\"DownloadBinCodeMap\">\n" +
                "                <BinCodeMap BinType=\"Integer2\" NullBin=\"0000\">\n" +
                "                    <BinCode>0t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000f00</BinCode>\n" +
                "                    <BinCode>0t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000f00</BinCode>\n" +
                "                    <BinCode>0t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000f00</BinCode>\n" +
                "                    <BinCode>0t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000f00</BinCode>\n" +
                "                    <BinCode>0t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000t00</BinCode>\n" +
                "                    <BinCode>0t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000t000t00</BinCode>\n" +
                "                </BinCodeMap>\n" +
                "            </Overlay>\n" +
                "        </SubstrateMap>\n" +
                "    </SubstrateMaps>\n" +
                "</MapData>";
//        List<Mapping2DBin> mapping2dbin = new ArrayList<Mapping2DBin>();
        try {
            System.out.println(getStripIdFromXml(xml2));
//            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//            DocumentBuilder db = dbf.newDocumentBuilder();
//            Document document = db.parse(new InputSource(new StringReader(xmlStr)));
//            Element root = document.getDocumentElement();
//
//            Element rnode = null;
//            for (int i = 0; i < root.getChildNodes().getLength(); i++) {
//                rnode = (Element) root.getChildNodes().item(i);
//                if (rnode.getNodeName().equalsIgnoreCase("SubstrateMaps")) {
//                    break;
//                }
//            }
//            Element esmap = (Element) rnode.getChildNodes().item(0);
//            String stripid = esmap.getAttribute("SubstrateId");
//            Element ebincodes = (Element) esmap.getChildNodes().item(1).getFirstChild();
//            NodeList binlist = ebincodes.getChildNodes();
//
//            for (int i = 0; i < binlist.getLength(); i++) {
//                Mapping2DBin tmp = new Mapping2DBin();
//
//                String bincode = binlist.item(i).getTextContent();
//                tmp.setStripid(stripid);
//                tmp.setRowno(new BigDecimal(i + 1));
//                tmp.setColqty(new BigDecimal(bincode.length() / 4));
//
//                Class clazz = tmp.getClass();
//                for (int j = 1; j <= tmp.getColqty().intValue(); j++) {
//                    Method setMethod = clazz.getMethod("setCol" + j, String.class);
//                    String value = String.valueOf(setMethod.invoke(tmp, bincode.substring((j - 1) * 4, j * 4)));
//                    setMethod.invoke(tmp, value);
//                }
//                mapping2dbin.add(tmp);
//            }
        } catch (Exception ex) {
            Logger.getLogger(XmlUtil.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
